package com.hhc.repository;

import com.hhc.entity.NoticeAnnouncement;
import com.hhc.entity.UserInfo;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 用户信息数据访问层接口
 *
 * @author pc
 */
@Repository
public interface UserInfoRepository extends JpaRepository<UserInfo, Long> {

    /**
     * 检查指定用户名是否存在
     *
     * @param username 用户名
     * @return 是否存在
     */
    boolean existsByUsername(String username);

    /**
     * 根据用户名查找用户信息
     *
     * @param username 用户名
     * @return 用户信息对象
     */
    UserInfo findByUsername(String username);

    /**
     * 查询所有用户
     *
     *
     * @return 列表
     */
    @Query("select u from UserInfo u")
    List<UserInfo> findAllUser();

    /**
     * 条件模糊查询用户列表（支持分页）
     */
    // 在UserInfoRepository中优化findByCondition方法
    default Page<UserInfo> findByCondition(String username, String email, String phone, Pageable pageable) {
        // 处理空字符串情况，转换为null
        String processedUsername = (username != null && !username.trim().isEmpty()) ? username.trim() : null;
        String processedEmail = (email != null && !email.trim().isEmpty()) ? email.trim() : null;
        String processedPhone = (phone != null && !phone.trim().isEmpty()) ? phone.trim() : null;

        return findByConditionWithNullCheck(processedUsername, processedEmail, processedPhone, pageable);
    }

    @Query("SELECT u FROM UserInfo u WHERE " +
            "(:username IS NULL OR u.username LIKE %:username%) AND " +
            "(:email IS NULL OR u.email LIKE %:email%) AND " +
            "(:phone IS NULL OR u.phone LIKE %:phone%)")
    Page<UserInfo> findByConditionWithNullCheck(
            @Param("username") String username,
            @Param("email") String email,
            @Param("phone") String phone,
            Pageable pageable
    );


}